package com.zmn.oms.model.dto.changerecord;

import com.zmn.common.utils.collection.CollectionUtil;
import com.zmn.common.utils.number.NumberUtil;
import com.zmn.oms.model.entity.serviceitem.OrderServiceItem;
import com.zmn.oms.model.entity.serviceitem.OrderServiceItemCell;
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 描述：工单修改服务项记录数据
 *
 * @author xiewenbing
 * @since 2022/5/24 22:04
 */
@Data
public class ChangeServiceItemDTO implements Serializable {

    /**
     * 订单id
     */
    Long orderId;

    /**
     * 工单id
     */
    Long workId;

    /**
     * 产品id
     */
    Integer productId;

    /**
     * 产品名称
     */
    String productName;

    /**
     * 订单金额
     */
    Integer totalAmount;

    /**
     * 服务项列表
     */
    List<ServiceItem> serviceItems;

    /**
     * 服务项列表
     */
    List<ServiceItemCell> serviceItemCells;

    /**
     * 修改者id
     */
    Long operatorId;

    /**
     * 修改者名称
     */
    String operator;

    /**
     * 修改时间
     */
    Date operateTime;

    /**
     * 排序
     */
    Integer sort;

    /**
     * 服务项
     */
    @Data
    public class ServiceItem implements Serializable{

        /**
         * 带参构造函数
         * @param itemId
         * @param itemName
         * @param itemAmount
         */
        public ServiceItem(Long itemId, String itemName, Integer itemAmount) {
            this.itemId = itemId;
            this.itemName = itemName;
            this.itemAmount = itemAmount;
        }

        /**
         * 服务项id
         */
        Long itemId;

        /**
         * 服务项名称
         */
        String itemName;

        /**
         * 服务项金额
         */
        Integer itemAmount;
    }

    /**
     * 服务项明细
     */
    @Data
    public class ServiceItemCell implements Serializable{

        /**
         * 带参构造函数
         * @param itemId
         * @param itemCellId
         * @param itemCellName
         * @param itemCellAmount
         */
        public ServiceItemCell(Long itemId, Long itemCellId, String itemCellName, Integer itemCellAmount) {
            this.itemId = itemId;
            this.itemCellId = itemCellId;
            this.itemCellName = itemCellName;
            this.itemCellAmount = itemCellAmount;
        }

       /**
         * 服务项Id
         */
        Long itemId;

        /**
         * 明细项Id
         */
        Long itemCellId;

        /**
         * 明细项名称
         */
        String itemCellName;

        /**
         * 明细项金额
         */
        Integer itemCellAmount;
    }

    /**
     * 设置服务项及服务项明细
     * @param orderServiceItemList
     */
    public void setServcieItemList(List<OrderServiceItem> orderServiceItemList) {

        if (CollectionUtil.isNullOrEmpty(orderServiceItemList)) {
            return;
        }

        serviceItems = new ArrayList<>(orderServiceItemList.size());
        for (OrderServiceItem serviceItem : orderServiceItemList) {
            addServiceItem(serviceItem.getItemId(), serviceItem.getServItemName(), serviceItem.getTotalPrice());

            if (CollectionUtil.isNullOrEmpty(serviceItem.getItemDetailList())) {
                continue;
            }

            serviceItemCells = new ArrayList<>(serviceItem.getItemDetailList().size());
            // 服务项明细
            for (OrderServiceItemCell itemCell : serviceItem.getItemDetailList()) {
                addServiceItemCell(serviceItem.getItemId(), itemCell.getCellId(),
                        itemCell.getItemCellName(), itemCell.getCellPrice());
            }
        }
    }

    /**
     * 添加服务项
     * @param itemId
     * @param itemName
     * @param itemAmount
     */
    private void addServiceItem(Long itemId, String itemName, Integer itemAmount) {

        if (NumberUtil.isNullOrZero(itemId)) {
            return;
        }

        if (Objects.isNull(serviceItems)) {
            return;
        }

        serviceItems.add(new ServiceItem(itemId, itemName, itemAmount));
    }

    /**
     * 添加服务项明细
     * @param itemId
     * @param itemCellId
     * @param itemCellName
     * @param itemCellAmount
     */
    private void addServiceItemCell(Long itemId, Long itemCellId, String itemCellName, Integer itemCellAmount) {

        if (NumberUtil.isNullOrZero(itemId) || NumberUtil.isNullOrZero(itemCellId)) {
            return;
        }

        if (Objects.isNull(serviceItemCells)) {
            return;
        }

        serviceItemCells.add(new ServiceItemCell(itemId, itemCellId, itemCellName, itemCellAmount));
    }
}
